#include"stdio.h"
#include"stdlib.h"
#define maxsize 1000
typedef struct elemtype{
	int m,n,sum,status;
}elemtype;
typedef struct stack{
	elemtype *top,*bottom;
}stack;
stack initstacks(){
	stack s;
	s.bottom=(elemtype*)malloc(sizeof(elemtype)*maxsize);
	s.top=s.bottom;
	return s;
}
int sta(int m,int n){
	if(n==0)
		return 3;
	if(m==n&&m!=0)
		return 2;
	if(m!=n&&n!=0)
		return -1;
}
int p(int m,int n){
	stack s=initstacks();
	s.top->m=m;
	s.top->n=n;
	s.top->sum=0;
	s.top->status=sta(m,n);
	while(s.bottom->status!=1){
		if(s.top->status==-1){
			s.top++;
			s.top->m=(s.top-1)->m;
			s.top->n=(s.top-1)->n-1;
			s.top->sum=0;
			s.top->status=sta(s.top->m,s.top->n);
		}
		else if(s.top->status==0){
			s.top++;
			s.top->m=(s.top-1)->m-1;
			s.top->n=(s.top-1)->n-1;
			s.top->sum=0;
			s.top->status=sta(s.top->m,s.top->n);
		}
		if(s.top->status==3||s.top->status==2){
			s.top->sum=1;
		}
		if(s.top->sum!=0&&(s.top-1)->status==-1&&s.top!=s.bottom){
			(s.top-1)->sum+=s.top->sum;
			(s.top-1)->status++;
			s.top--;
		}else if(s.top->sum!=0&&(s.top-1)->status==0&&s.top!=s.bottom){
			(s.top-1)->sum+=s.top->sum;
			(s.top-1)->status++;
			s.top--;
		}
		if(s.top->sum!=0&&(s.top-1)->status==1&&s.top!=s.bottom){
			(s.top-1)->sum+=s.top->sum;
			(s.top-1)->status++;
			s.top--;
		}
		if(s.bottom->status==2||s.bottom->status==3)break;
	}
	return s.bottom->sum;
}

void main(){
	for(int i=0;i<10;i++)
	{for(int j=i;j>=0;j--)
		{printf("%5d",p(i,j));}
	printf("\n");}
}